package com.fagertveit.android.game.framework.geom;

import android.util.FloatMath;

public class Vector2 {
	public static float TO_RADIANS = (1 / 180.0f) * (float) Math.PI;
	public static float TO_DEGREES = (1 / (float) Math.PI) * 180;
	public float x = 0.0f;
	public float y = 0.0f;
	
	public Vector2(float x, float y) {
		this.x = x;
		this.y = y;
	}
	
	public Vector2(Vector2 other) {
		this.x = other.x;
		this.y = other.y;
	}
	
	public Vector2() {
		this.x = 0.0f;
		this.y = 0.0f;
	}
	
	public Vector2 copy() {
		return new Vector2(this.x, this.y);
	}
	
	public void set(float x, float y) {
		this.x = x;
		this.y = y;
	}
	
	public void setX(float x) {
		this.x = x;
	}
	
	public void setY(float y) {
		this.y = y;
	}
	
	public float getX() {
		return this.x;
	}
	
	public float getY() {
		return this.y;
	}
	
	public Vector2 add(Vector2 other) {
		this.x += other.x;
		this.y += other.y;
		return this;
	}
	
	public Vector2 add(float x, float y) {
		this.x += x;
		this.y += y;
		return this;
	}
	
	public Vector2 sub(Vector2 other) {
		this.x -= other.x;
		this.y -= other.y;
		return this;
	}
	
	public Vector2 sub(float x, float y) {
		this.x -= x;
		this.y -= y;
		return this;
	}
	
	public Vector2 scale(float s) {
		this.x *= s;
		this.y *= s;
		return this;
	}
	
	public float dot(Vector2 other) {
		return ((this.x * other.x) + (this.y * other.y));
	}
	
	public float length() {
		return FloatMath.sqrt(this.x * this.x + this.y * this.y);
	}
	
	public Vector2 nor() {
		float len = this.length();
		if(len != 0) {
			this.x /= len;
			this.y /= len;
		}
		return this;
	}
	
	public float angle() {
		float angle = (float) Math.atan2(this.y, this.x) * Vector2.TO_DEGREES;
		if(angle < 0) {
			angle += 360;
		}
		return angle;
	}
	
	public Vector2 rotate(float angle) {
		float rad = angle * Vector2.TO_RADIANS;
		float cos = FloatMath.cos(rad);
		float sin = FloatMath.sin(rad);
		
		float newX = this.x * cos - this.y * sin;
		float newY = this.x * sin + this.y * cos;
		
		this.x = newX;
		this.y = newY;
		
		return this;
	}
	
	public float dist(Vector2 other) {
		float distX = this.x - other.x;
		float distY = this.y - other.y;
		return FloatMath.sqrt(distX * distX + distY * distY);
	}
	
	public float dist(float x, float y) {
		float distX = this.x - x;
		float distY = this.y - y;
		return FloatMath.sqrt(distX * distX + distY * distY);
	}
}
